25.自動記録マクロの編集
最近はPCを購入すればたいていExcelが入っている。Excelが入っていると言う
ことはVBAも入っており誰でもタダで(VBを行う人は別途購入する必要あり)、
簡単にExcelマクロを作成することが出来る。非常に簡単な割にはVBAを有効に活用し
積極にマクロを作成している人が少ない。何故少ないか考えると、多分「自動記録」
まではExcelが勝手にやってくれるので問題ないが、それをつなぎ合わせたり、記録された
内容を一部変更したり、セル座標を変数に置き換える等「自動記録マクロ」の手直し
をどの様に行ってよいか判らず、カスタムマクロを作成しないのだと思う。
本項に、自動記録マクロ手直に関するノウハウを記述する。
25−1.カスタムマクロとは
自動記録したマクロに対し、自分で作ったマクロをここではカスタムマクロと呼ぶこと
にする。下図のようにセルに色を付けるマクロ作成を例に説明する。

●(1)下記は最も一般的な例で、セルを1個づつ選び色指定した場合の自動記録
(マクロが長くなるので5行まで記述)
Sub Macro6()
Range("R2").Select
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Range("R3").Select
With Selection.Interior
.ColorIndex = 4
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Range("R4").Select
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Range("R5").Select
With Selection.Interior
.ColorIndex = 4
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Range("R1").Select
End Sub
●(2)下記は、「Ctrlキ−」を押しながらセルを選び色付けしたケ−スで、同じ色に
するセルを先に選ぶ等、Excelの操作を効率的に行えばマクロも短くなる。
Sub Macro2()
Range("R2,R4,R6,R8").Select
Range("R8").Activate
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Range("R3,R5,R7,R9").Select
Range("R9").Activate
With Selection.Interior
.ColorIndex = 4
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Range("R1").Select
End Sub
●(3)この色付け操作を、繰り返し(For)と条件分岐(If)を使用して"Cells"メソッド
でカスタムマクロを組むと、下記のようなスッキリしたマクロになる。
Sub Macro3()
For i = 2 To 9
If i Mod 2 = 0 Then
Cells(i, 18).Interior.ColorIndex = 3
Else
Cells(i, 18).Interior.ColorIndex = 4
End If
Next
End Sub
以上のように、For、If等の簡単なBASIC知識と、自動記録を"Cells"メソッドに変える
方法を理解すれば、複雑なマクロを作成することができるようになる。
25−2.不用個所の削除
●25項の例はセルに色を付けるだけで、他は標準設定のままなので特に指定する
必要がないので手でカットすると、下記のようになる。(マクロは記述された通り
実行されるので、ステ−トメント数が減れば実行速度もアップする)
Sub Macro2()
Range("R2,R4,R6,R8").Select
Selection.Interior.ColorIndex = 3
Range("R3,R5,R7,R9").Select
Selection.Interior.ColorIndex = 4
Range("R1").Select
End Sub
●下記のようにセルを選択した事も記録されるが、カスタムマクロで記述する場合は、
Macro2()のようにセルへダイレクト入力に記述した方が実行速度向上にもなる。
Sub Macro1()
Range("A1").Select
ActiveCell.FormulaR1C1 = "ABCDEF"
Range("B2").Select
ActiveCell.FormulaR1C1 = "あいうえお"
End Sub
Sub Macro2()
Range("A1").FormulaR1C1 = "ABCDEF"
Range("B2").FormulaR1C1 = "あいうえお"
End Sub
参考25-1 A1形式の数字対象表
自動記録した列を"Cells"で書く時指を折って数字に変えていたが、対象表が
あれば便利なのでここに記載した。(上記Range("R2")はCells(2,18)、R→18
のように使用)
| A |
B | C | D |
E | F | G |
H | I | J |
K | L | M |
N | O | P |
Q | R | S |
T | U | V |
W | X | Y |
Z |
| 1 |
2 | 3 | 4 |
5 | 6 | 7 |
8 | 9 | 10 |
11 | 12 | 13 |
14 | 15 | 16 |
17 | 18 | 19 |
20 | 21 | 22 |
23 | 24 | 25 |
26 |
| AA |
AB | AC | AD |
AE | AF | AG |
AH | AI | AJ |
AK | AL | AM |
AN | AO | AP |
AQ | AR | AS |
AT | AU | AV |
AW | AX | AY |
AZ |
| 27 |
28 | 29 | 30 |
31 | 32 | 33 |
34 | 35 | 36 |
37 | 38 | 39 |
40 | 41 | 42 |
43 | 44 | 45 |
46 | 47 | 48 |
49 | 50 | 51 |
52 |
| BA |
BB | BC | BD |
BE | BF | BG |
BH | BI | BJ |
BK | BL | BM |
BN | BO | BP |
BQ | BR | BA |
BT | BU | BV |
BW | BX | BY |
BZ |
| 53 |
54 | 55 | 56 |
57 | 58 | 59 |
60 | 61 | 62 |
63 | 64 | 65 |
66 | 67 | 68 |
69 | 70 | 71 |
72 | 73 | 74 |
75 | 76 | 77 |
78 |
25−3.A1形式を"Cells"メソッドに書き換え
自動記録されたA1形式は、セル指定を変数で指定出来ないのでカスタムマクロを組む
場合は必要に応じ"Cells"メソッドに変える。
(下記マクロは、自動記録:緑色、ピンク色:カスタム)
●(1)セル1個指定の置き換え
Sub Macro1()
Range("A2").Select
End Sub
Sub Macro1a()
Cells(2,1).Select
End Sub
●(2)複数セルの置き換え
Sub Macro2()
Range("B2:F9").Select
End Sub
Sub Macro2a()
Range(Cells(2, 2), Cells(9, 6)).Select
End Sub
●(3)1行指定の置き換え
Sub Macro3()
Rows("5:5").Select
End Sub
Sub Macro3a()
Rows(5).Select
End Sub
●(4)複数行指定の置き換え
Sub Macro4()
Rows("5:7").Select
End Sub
Sub Macro4a()
Range(Rows(5), Rows(7)).Select
End Sub
●(5)1列指定の置き換え
Sub Macro5()
Columns("D:D").Select
End Sub
Sub Macro5a()
Columns(4).Select
End Sub
●(6)複数列指定の置き換え
Sub Macro6()
Columns("D:E").Select
End Sub
Sub Macro6a()
Range(Columns(4), Columns(5)).Select
End Sub
●(7)ワ−クシ−ト全体の指定
Sub Macro7a()
Cells.Select
End Sub
自動記録をそのまま使用
25−4.セルへ書き込みの置き換え
●(1)自動記録で("B2")に"5"、("B3")に"10"を入れ("B4")にそのを合計値表示
Sub Macro1()
Range("B2").Select
ActiveCell.FormulaR1C1 = "5"
Range("B3").Select
ActiveCell.FormulaR1C1 = "10"
Range("B2:B4").Select
Range("B4").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"
Range("D6").Select
End Sub
●(2)セルを選択し、そのアクティブセルへFormulaプロパティで入力
Sub Macro1A()
Range("B2").Select
ActiveCell.Formula = "5"
Range("B3").Select
ActiveCell.Formula = "10"
Range("B4").Activate
ActiveCell.Formula = "=SUM(B2:B3)"
End Sub
●(3)セルを選択し、そのアクティブセルへValueプロパティで入力
Sub Macro1B()
Range("B2").Select
ActiveCell.Value = "5"
Range("B3").Select
ActiveCell.Value = "10"
Range("B4").Activate
ActiveCell.Value = "=SUM(B2:B3)"
End Sub
●(4)セルへValueプロパティで入力(A1形式)
Sub Macro1C()
Range("B2").Value = "5"
Range("B3").Value = "10"
Range("B4").Value = "=SUM(B2:B3)"
End Sub
●(5)セルへValueプロパティで入力(Cellsメソッド使用)
Sub Macro1D()
Cells(2, 2).Value = "5"
Cells(3, 2).Value = "10"
Cells(4, 2).Value = "=SUM(B2:B3)"
End Sub
●(6)セルへValueプロパティ省略で入力(Cellsメソッド使用)
Sub Macro1D()
Cells(2, 2) = "5"
Cells(3, 2) = "10"
Cells(4, 2) = "=SUM(B2:B3)"
End Sub
セルへ入力は、上記のように[1]FormulaR1C1、[2]Formula、[3]Valueの3種類あるが
(Value省略を入れると4種類)、値又は数式をどの方法で入力してもよい。
25−5.セルからデ−タ取得
d1 = Cells(2, 2).Value
d2 = Cells(3, 2)
d3 = Cells(4, 2).Value
d4 = Cells(4, 2).Formula
MsgBox "d1:" & d1 & " d2:" & d2 & " d3:" & d3 & " d4:" & d4
セルに25-4項で実行した内容が入っている場合、変数d3は"15"が入っており、変数d4は"=SUM(B2:B3)"
が入っている。したがってたがって値を取得は.Valueで、式を取得は.Formulaのように使い分ける
必要がある。
25−6.複数セル指定の置き換え例
●指定したセルのデ−ダの、文字"cccc"を"xxxx"へ置き換えたケ−ス
’シ−ト全体を対象に実行
Sub Macro1()
Cells.Replace What:=, Replacement:="xxxx", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("B3").Select
End Sub
’A列を対象に実行
Sub Macro2()
Columns("A:A").Select
Selection.Replace What:="cccc", Replacement:="xxxx", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("A1").Select
End Sub
’A1形式をColumnsメソッドに変えた例
Sub Macro2a()
Columns(1).Replace What:="cccc", Replacement:="xxxx", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("A1").Select
End Sub
●オ−トフィルタ−機能で文字"bbbbb"のあるセルを抽出した例
Sub Macro1()
dat = "bbbbb"
Range("a1").Select
Selection.AutoFilter Field:="2", Criteria1:=dat
End Sub
Sub Macro1a()
dat = "bbbbb"
Cells(10, 5).Select
Selection.AutoFilter Field:="2", Criteria1:=dat
Range("a1").Select
End Sub
このケ−スではデ−タの入っているセルを1個選択するだけであり、置き換える必要はない。
●アドバンスフィルタ−機能で文字"bbbbb"のあるセルを抽出した例
Sub Macro1()
'検索デ−タセット
Cells(2, 5) = "bbbbb"
'抽出実行
Range("A1:B100").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("E1:E2"),CopyToRange:=Range("E5:F6")
End Sub
Sub Macro1a()
'検索デ−タセット
Cells(2, 5) = "bbbbb"
'抽出実行
Range(Cells(1, 1), Cells(cellend, 2)).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("E1:E2"),CopyToRange:=Range("E5:F6")
End Sub
上記のケ−スでは最終行を変数に(上記例:cellend)置き換えることにより、デ−タベ−ス
の増減に対応できる。
25−7.変数へ置き換え
カスタムマクロ作成では、セル座標やデ−タを変数に入れることにより各種制御が
可能になる。下記はセル座標を変数で指定した例。
Cells(2, 2).Value = "5"
Cells(3, 2).Value = "10"
Cells(4, 2).Value = "=SUM(B2:B3)"
Dim c As Integer '列
Dim r As Integer '行
c=2:r=2
Cells(r, c).Value = "5"
Cells(r+1, c).Value = "10"
Cells(r+2, c).Value = "=SUM(B2:B3)"
変数・定数の使用法詳細は、Excel95コ−ナ−の4.変数と定数
を参照のこと。
25−8.変数へ入れた文字・数字の制御例
文字の一部を取り出す等、VBAでどんな制御が出来るか理解するとカスタムマクロ
作成のスキルアップになります。
下記によく使用する文字変数の制御方法をまとめました。
Sub 例258()
Dim moz1 As String
Dim moz2 As Integer
Dim moz3 As String
moz1 = "ABCDEFGHIJKLMN": moz2 = 123: moz3 = "567"
-----------------------------------------------------------------------------------
(1) 文字数
Cells(1, 1) = Len(moz1) '文字数を求める。 結果 A1:14
-----------------------------------------------------------------------------------
(2) 文字列の取り出し
Cells(2, 1) = Left(moz1, 4) '文字列の左より取り出し。 結果 A2:ABCD
Cells(3, 1) = Right(moz1, 4) '文字列の右より取り出し。 結果 A3:KLMN
Cells(4, 1) = Mid(moz1, 5, 4) '文字列の指定個所取り出し。 結果 A4:EFGH
Cells(5, 1) = Mid(moz1, 5) '文字列の指定個所取り出し。 結果 A5:EFGHIJKLMN
-----------------------------------------------------------------------------------
(3) 文字の位置
Cells(6, 1) = InStr(3, moz1, "e", 1) '文字列より指定した文字の位置。 結果 A6:5
'上記3は検索開始位置、1は大文字・小文字区別しない
-----------------------------------------------------------------------------------
(4) 文字→数字、数字→文字
Cells(7, 1) = Str(moz2 + 111) '引数の値を文字列に変換。結果 A7: 234(先頭は空白1コ)
Cells(8, 1) = Val(moz3 & "111") '文字列を引数に変換。 結果 A8:567111
-----------------------------------------------------------------------------------
(5) 小文字・大文字変換
Cells(9, 1) = LCase("ABCD") 'アルファベットを小文字に変換。 結果 A9:abcd
Cells(10, 1) = UCase("abcd") 'アルファベットを大文字に変換。 結果 A9:ABCD
-----------------------------------------------------------------------------------
(6) Like演算子にパターン認識
aa = Cells(9, 1) Like "*b*"
MsgBox aa 'Like演算子でパターン認識 結果 aa:True
bb = Cells(9, 1) Like "*B*"
MsgBox bb 'Like演算子でパターン認識 結果 bb:False
cc = Cells(9, 1) Like "b"
MsgBox bb 'Like演算子でパターン認識 結果 cc: False
※ 上記はセルのデ−タを識別しているが、変数に対しても同様
dat="abcd"
ee = dat Like "*b*"
MsgBox ee 'Like演算子でパターン認識 結果 ee:True
-----------------------------------------------------------------------------------
(7) 文字列の比較
Cells(12, 1) = StrComp(Cells(9, 1), Cells(10, 1), 0) ' 結果 A12:1
Cells(13, 1) = StrComp(Cells(9, 1), Cells(10, 1), 1) ' 結果 A13:0
-----------------------------------------------------------------------------------
(8) 文字列の一部を指定
Cells(14, 1) = moz1
Cells(14, 1).Select
ActiveCell.Characters(4, 3).Font.ColorIndex = 3 '結果 DEF が赤になる
-----------------------------------------------------------------------------------
(9) 文字列の一部を置換え(Insert)
Cells(15, 1) = moz1
Cells(15, 1).Select
ActiveCell.Characters(4, 3).Insert "aaa" '結果ABCaaaGHIJKLMN
-----------------------------------------------------------------------------------
(10) 文字列の一部を置換え(Replace)
Cells(16, 1) = moz1
Cells(16, 1).Select
ActiveCell.Replace "GHI", "bbb111" '結果ABCDEFbbb111JKLMN
End Sub
-----------------------------------------------------------------------------------
(11) 文字列の置換え
Sub 例258b()
Cells(1, 1) = "ABCDCFGHIJ"
Cells(2, 1) = "FGHIJKLMNO"
Range("A:A").Select
Selection.Replace What:="FGH", Replacement:="aaa", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End Sub
結果:"ABCDCFGHIJ"→"ABCDCaaaIJ"、"FGHIJKLMNO"→aaaIJKLMNO
-----------------------------------------------------------------------------------
(12) 文字列の置換え(strconv)
Sub Macro1()
Cells(1, 1) = strconv("abcd", 1) '大文字に変換 (結果:ABCD)
Cells(2, 1) = strconv("DEFG", 2) '小文字に変換 (結果:defg)
Cells(3, 1) = strconv("abcd", 3) '先頭を大文字に変換 (結果:Abcd)
Cells(4, 1) = strconv("defg", 4) '半角を全角に変換 (結果:defg)
Cells(5, 1) = strconv("ABCD", 8) '全角を半角に変換 (結果:ABCD)
Cells(6, 1) = strconv("あいうえ", 16) '全角ひらがなをカタへ(結果:アイウエ)
Cells(7, 1) = strconv("カキクケ", 32) '全角カナをひらがなへ(結果:かきくけ)
End Sub
-----------------------------------------------------------------------------------
(13) 文字列の取り出し(Replace)
Sub Macro1()
Cells(12, 1) = "ABCDEFGHIJGKLMN"
Cells(12, 1).Replace "*D", "" '文字列の指定個所取り出し。 結果 A4:EFGH
Cells(12, 1).Replace "I*", ""
Cells(13, 1) = "ABCDEFGHIJGKLMN"
Cells(13, 1).Replace "*D", "" '文字列の指定個所取り出し。 結果 A5:EFGHIJKLMN
End Sub
下記は文字制御とは直接関係ないがBasic初心者への参考資料として掲載
[1]先頭の空白を削除(結果は上記"A7"の先頭空白が無くなっている)
aa=Mid(Str(moz2 + 111), 2)
又は
aa = LTrim(Str(moz2 + 111))
文字列の検索等を行う場合は、上記処理を行わないと文字が一致しません。
参考:RTrim(string)→末尾の余分な空白を削除
Trim(string)→先頭と末尾の余分な空白を削除
'-----------------------------------------------------------------------------------
[2]階層を簡単に付ける方法
Sub 例258k2() '結果
AAA = "ABCDE" '■ABCDE
For i = 1 To 4 ' ■ABCDE
fs = String(i, " ") ' ■ABCDE
Cells(i, 1) = fs & "■" & AAA ' ■ABCDE
Next
End Sub
'-----------------------------------------------------------------------------------
[3]ビットチェック
下記は変数"nd"のビットをチェックしA〜Zに対応させたケース
Sub 例258k3()
For i = 0 To 26
If nd And 2 ^ i Then
MsgBox Chr(65 + i)
End If
Next
End Sub
'-----------------------------------------------------------------------------------
[4]文字コ−ドの制御
Sub 例258k4()
MsgBox Hex(Asc("A")) 'ASCコ−ド→41
MsgBox Chr(&h41) '文字 →A
MsgBox Val("&h41") '10進数 →65
MsgBox Hex(Asc(Cells(1, 1))) 'セル"A1"1文字目のASCコ−ド取得
End Sub
'-----------------------------------------------------------------------------------
[5]配列のデ−タを若番順に並び替え
Sub 例258k5()
Dim dat(10) As Integer
'下記はデバッグ用数字入力
dat(1) = 3: dat(2) = 1: dat(3) = 8: dat(4) = 0: dat(5) = 9
dat(6) = 4: dat(7) = 2: dat(8) = 5: dat(9) = 6: dat(10) = 7
For j = 1 To 10
For r = j + 1 To 10
If dat(j) > dat(r) Then
datm = dat(j)
dat(j) = dat(r)
dat(r) = datm
End If
Next
Next
MsgBox dat(1) & " " & dat(2) & " " & dat(3) & " " & dat(4) & " " & dat(5) _
& " " & dat(6) & " " & dat(7) & " " & dat(8) & " " & dat(9) & " " & dat(10)
End Sub
'-----------------------------------------------------------------------------------
[6]配列のデ−タを老番順に並び替え
Sub 例258k6()
Dim dat As Variant
'下記はデバッグ用数字入力
dat = Array(3, 1, 8, 0, 9, 4, 2, 5, 6, 7)
For j = 0 To 9
For r = 9 To j Step -1
If dat(j) < dat(r) Then
datm = dat(j)
dat(j) = dat(r)
dat(r) = datm
End If
Next
Next
MsgBox dat(0) & " " & dat(1) & " " & dat(2) & " " & dat(3) & " " & dat(4) _
& " " & dat(5) & " " & dat(6) & " " & dat(7) & " " & dat(8) & " " & dat(9)
End Sub
'-----------------------------------------------------------------------------------
[7]配列のデ−タを後ろへずらした例
配列"i番"へ別なデ−タを入れる関係で、i以降を1個後ろへずらした
Sub 例258k7()
For j = 49 To i Step -1
f(1, j + 1) = f(1, j)
Next
End Sub
'-----------------------------------------------------------------------------------
[8] 途中にあるブランクを詰めたケース
Sub 例258k8()
For i = 1 To end1
If dat2(i) = "" Then
For j = i To end1
dat2(j) = dat2(j + 1)
Next
End If
Next
End Sub
'-----------------------------------------------------------------------------------
[9] 列のアルファベット入力を数字化
変数で使用する関係で数字に変換した例(アルファベット大文字・小文字OK)
Sub Macro1()
c2ur = Cells(1, 1)
If c2ur <> "" Then
c2ura = UCase(c2ur)
c2 = Asc(c2ura) - 64
If c2 < 0 Or c2 > 26 Then
MsgBox "列指定が不正です(A〜Z or a〜z を入力)"
Exit Sub
End If
End If
MsgBox c2ur & " は数字の列では " & c2
End Sub
'-----------------------------------------------------------------------------------
[10] 前にゼロを付け常に3桁にした例
Sub Macro1()
Cells(1, 1).Select
Selection.NumberFormatLocal = "@"
ddd = Cells(1, 1)
ddd = Right("00" & ddd, 3)
Cells(1, 1) = ddd
End Sub
'-----------------------------------------------------------------------------------
[11] セル内折り返しを解除した例
Sub Macro1()
If Cells(2, 3).WrapText = True Then
Cells(2, 3).WrapText = False
If InStr(1, Cells(2, 3), Chr(10), 1) > 0 Then
Cells(2, 3).Replace Chr(10), ""
End If
End If
End Sub
・"WrapText = False"のみでは[Alt+Enter]で行なった分が解除できません。
'-----------------------------------------------------------------------------------
[12] セル内文字を置換え戻した例
セル内のデータはReplaceで簡単に置き換えられるので、置換え後戻すアイディアもある。
uud1 = Cells(2, 3)
If InStr(1, uud1, "target", 1) > 0 Then
Cells(2, 3).Select
ActiveCell.Replace What:=" target=""*"">", Replacement:=">", LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=False
uud2 = Cells(2, 3)
Cells(2, 3) = uud1
End If
本例の結果(uud2が必要データ):
uud1 → <A HREF="http://excel-vba.hoops.ne.jp/" target="top">VBA便利帳</A>
uud2 → <A HREF="http://excel-vba.hoops.ne.jp/">VBA便利帳</A>
'-----------------------------------------------------------------------------------
[13] 配列のデータを10列に記入例
Sub Macro1()
Dim ddd(100) As Integer
For i = 1 To 100
c = (i - 1) Mod 10 + 1
r = (i - 1) \ 10 + 1
Cells(r, c) = ddd(i)
Next
End Sub
25−9.繰返し処理
繰り返し同じ処理を行う場合、For・Do使用により同一実行内容のマクロは1個書けばよい。
下記例は、変数"i"を変化させその値を行番号にすると共に、"i"の数値をセルに入れた例
Sub Macro3()
For i = 2 To 9
Cells(i, 3)=i
Next
End Sub
繰返し処理の説明及び例題はExcel95コ−ナ−の、
7.繰返し処理にあります。
25−10.条件判断処理
条件を指定し処理内容を変える。下記例は偶数セルを赤奇数セルを緑に
したケ−ス。
Sub Macro3()
For i = 2 To 9
If i Mod 2 = 0 Then
Cells(i, 18).Interior.ColorIndex = 3
Else
Cells(i, 18).Interior.ColorIndex = 4
End If
Next
End Sub
条件判断処理の説明及び例題はExcel95コ−ナ−の、
6.条件判断処理にあります。
追記:上記マクロの演算子"Mod"はExcel95コ−ナ−の
参考4−7:演算子の種類に使用法の説明あり
目次へ戻る